Emulation is a technique that involves providing the functionality of a central processing unit from software. One advantage to emulation is that you can run software designed for a specific type of processor on any other type of processor. Virtualization is a technique that provides the ability to partition hardware in a way that allows more than one operating system to run simultaneously. With virtualization, a physical central processing unit is partitioned into multiple contexts. Each context then takes turns running directly on the processor. Even though virtualization products are generally faster than emulation products, both types of products today suffer from several complications that limit the speed that can be achieved. As one example, dealing with concurrency during emulation requires additional synchronization which can slow down serial performance. As a second example, tracking self-modifying code under emulation usually incurs a substantial performance burden.